package com.dongnao.network.nio;

import java.nio.ByteBuffer;

/**
 * @author sjy
 * @date 2024年05月09日 14:23
 */
public class BufferDemo {

    public static void main(String[] args) {
        //构建一个字节缓冲区（堆内，非直接内存），容量为10
        ByteBuffer byteBuffer = ByteBuffer.allocate(10);
        //默认写入模式
        System.out.println(String.format("初始化：capacity容量：%s, position位置：%s, limit限制：%s",
                byteBuffer.capacity(), byteBuffer.position(), byteBuffer.limit()));
        byteBuffer.put((byte)1);
        byteBuffer.put((byte)2);
        byteBuffer.put((byte)3);
        System.out.println(String.format("写入3个字节后：capacity容量：%s, position位置：%s, limit限制：%s",
                byteBuffer.capacity(), byteBuffer.position(), byteBuffer.limit()));
        System.out.println("--------------------------------开始读取----------");
        //转换为读取模式(不调用flip方法，也是可以读取数据的，但是position记录读取的位置不对)
        byteBuffer.flip();//limit=position,position=0
        byte a1 = byteBuffer.get();
        System.out.println(a1);
        byte a2 = byteBuffer.get();
        System.out.println(a2);
        System.out.println(String.format("读取2个字节后：capacity容量：%s, position位置：%s, limit限制：%s",
                byteBuffer.capacity(), byteBuffer.position(), byteBuffer.limit()));

        //clear方法清除整个缓冲区，compact方法仅清除已读数据，转为写入模式
        byteBuffer.compact();//未读取的数据移到空间最左侧
        System.out.println(byteBuffer);
        byteBuffer.put((byte)4);
        byteBuffer.put((byte)5);
        byteBuffer.put((byte)6);
        System.out.println(String.format("又写入3个字节后：capacity容量：%s, position位置：%s, limit限制：%s",
                byteBuffer.capacity(), byteBuffer.position(), byteBuffer.limit()));

        //byteBuffer.mark();//标记当前position的位置
        //byteBuffer.reset();//重置position为上次mark()标记的位置

        //可用来重读Buffer中的所有数据
        //byteBuffer.rewind();//重置position为0，mark为-1

        //清空缓冲区Buffer，未读的数据也被删除
        //byteBuffer.clear();
    }
}
